perm filename PASS2.SAI[JLG,SYS] blob
sn#822780 filedate 1986-08-14 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00016 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002
C00016 00003 SIMPLE INTEGER PROCEDURE BYTECOUNT(INTEGER BPNOW, BPTHEN)
C00031 00004 ONE ← 1 COMMENT TO FORCE ARRAY TO BE DYNAMIC
C00047 00005 BEGIN "INNER BLOCK"
C00058 00006 SIMPLE PROCEDURE UNDERSCORE(INTEGER RIGHTCHAR)
C00067 00007 SIMPLE PROCEDURE SLIDERROR
C00070 00008 IF PAGEHIGH THEN GO TO CONTINUE comment, re-entered
C00075 00009 WHILE (TOPLINE ← INNUM) > -10 DO
C00078 00010 CASE CHARTBL[PAGEBRC] OF
C00081 00011 4 ... CR -- Justify it
C00088 00012 ELSE BEGIN CHAR ← 0 MAX APPD(S)
C00097 00013 ELSE IF F="F" THEN FONTSELECT(S[3 FOR 1])
C00103 00014 5 ... LF BEGIN END
C00109 00015 IFC SAILVER OR PARCVER THENC
C00114 00016 BEGIN EXTERNAL SIMPLE PROCEDURE K!OUT K!OUT END COMMENT ** ** ** ** **
C00120 ENDMK
C⊗;
BEGIN "PUB2"
COMMENT NOTE THAT THE PARCVER USES MEMORY PAGES 700-712 AS A BUFFER ;
REQUIRE "[]<>" DELIMITERS ;
REQUIRE "SITE" SOURCE!FILE;
REQUIRE 6500 STRING!SPACE ;
DEFINE
PASSONE = [FALSE],
PASSTWO = [TRUE],
BEGOF(NAME) = [ ],
ENDOF(NAME) = [ ],
PROCEDURES = [ ],
FINISHED = [ ],
PUBLIC = [ ],
PRIVATE = [ ],
$ = ["],
# = [],
IFK = [IFC],
THENK = [THENC],
IFSITE = [IFK],
SITE(DUMMY) = [ ],
TERNAL = [] ;
REQUIRE "COMMON" SOURCE!FILE ;
COMMENT The Document Compiler -- Pass Two ;
COMMENT Pass One and Two share certain declarations, but in
one case, the meaning of a variable is different:
In Pass 1, XCRIBL is true for either
an XGP -or- PARC's MIC.
In Pass 2, XCRIBL is only true for an
XGP. MICRO is true for PARC's MIC
and RASTER is true for both. ;
COMMENT PASS 1 OUTPUT FORMAT FOR EACH PAGE :
Height Width MillLeftMargin MillRightMargin
For each area:
UpperLine NumCols NumLines
For each column:
LeftChar
For each non-null line:
Line Number
How far short of justification
Excess mill leading
Index of Intermediate Ascii File line
0
-10
PASS 2 reads the output file name and the intermediate page file names from
PUPSEQ.PUI, and the label table from PULABL.PUI. Then it reads
each page from each page file, processes each line in each of
its areas, and writes out a line printer image on the output file.
Each line is subject to three operations, in this order:
(1) Substitute label values at each vertical tab.
(2) Justify the line, if required, by inserting spaces at word breaks marked by altmodes.
(3) Generate underlining and super/sub-scripting as indicated by rubouts.
;
IFC CMUVER THENC REQUIRE "PUBTMP.SAI" SOURCE!FILE;
REQUIRE "CMUPUB.SAI" SOURCE!FILE;
ENDC COMMENT RKJ: 26-SEP-74 and 6-Feb-75;
DEFINE THRU = [STEP 1 UNTIL], DOWN = [STEP -1 UNTIL],
LH(X) = [(X LSH -18)], RH(X) = [(X LAND '777777)],
AWHILE = [WHILE TRUE],
INNUM = [WORDIN(ICHAN)],
SCN(BRKTBL)= [(IF FROMFILE THEN INPUT(SCHAN,BRKTBL) ELSE SCAN(OWL,BRKTBL,PAGEBRC))],
SCNUM = [CVD(SCN(TO!ALTMODE!SKIP))],
LPT = [1], TTY = [2], MIC = [3], XGP = [4],
HORIZ= ['40], VERTI= ['41], CSIZE= ['42], ULINE= ['43], RSPCS= ['44],
LSPCS= ['45], UDOTS= ['46], RDOTS= ['47], comment FR80 escape codes ;
FULSTR(X) = [LENGTH(X)], NULSTR(X) = [(LENGTH(X)=0)],
CR = ['15], LF = ['12], VT = ['13], FF = ['14], SP = ['40],
RUBOUT = ['177], TB = ['11],
ALTMODE = IFC TENEX THENC ['33] ELSEC
IFC SAILVER THENC ['175] ELSEC ['176] ENDC
ENDC,
TO!ALTMODE!SKIP = [1], TO!LF!APPD = [2],
ONE!CHAR = [3], BREAKER = [4], TO!RUB!ALT!SKIP = [5],
LOCAL!TABLE = [6],
FIML = [256],
ANS(A) = [(S = "A" OR S = "A" + '40)];
DEFINE COMMENT FOR XGP;
USEA= [('177&'14)], USEB= [('177&'15)], VSB= [('177&'20)],
XTAB= [('177&'30)],
XGPNUM(N)= [(((N) LSH -7) & (N))]; RKJ: 6-Feb-75 needed more ();
DEFINE ESCAPE1= [('177&'1)], ESCAPE2= [('177&'2)];
DEFINE CTLK = [11], CTLF= [6], CTLE= [5], CTLT= ['24], CTLQ= ['21];
IFC SAILVER THENC DEFINE RPGEXT = [".RPG"] ; ENDC
IFC CMUVER THENC
STRING PUIEXT; RKJ: 6-FEB-75;
ELSEC
PJ 5/28/74 ; DEFINE
PUIEXT = IFC ITSVER THENC [" PUI"] ELSEC [".PUI"] ENDC,
OCTEXT = IFC ITSVER THENC [" OCT"] ELSEC [".OCT"] ENDC,
TXTEXT = IFC ITSVER THENC [" ASC"] ELSEC [".ASC"] ENDC;
ENDC
TES 1/7/74 ; DEFINE CTLC= [3], CTLH= ['10], CTLR= ['22], CTLU= ['25], CTLS= ['23] ;
EXTERNAL INTEGER !SKIP! ;
INTEGER BRC, EOF ; COMMENT FOR FONTS TES 10/22/74 ;
INTEGER IML, IMC, comment, no. of lines and chars per page image ;
DEBUG, DEVICE, SEQCHAN, SEQBRC, SEQEOF, comment PUPSEQ.PUI info ;
LFTMAR, comment RASTER left margin (for tabs) ;
RGTMAR, comment RASTER right margin ;
INTRA, comment TES 6/11/74 PARC XGP Intra-line spacing (normally 3) ;
MILLVERTI, RASTVERTI, COMMENT TES 11/2/74 "NORMAL" INTERLINE FOR THIS DOC ;
LISTCHAN, comment output file ;
BAR, TES underlining character (or 0 if OFF) 10/22/73;
PAGEHIGH, PAGEWIDE, comment IML and IMC for latest page ;
I, J, K, L, M, N, DUMMY, comment general-purpose ;
LABCHAN, LABBRC, LABEOF, comment PULABL.PUI info ;
NL, comment LABTAB upper bound ; PAGECT, comment counts pages ;
TABLE, comment LABTAB first subscript -- selects Pass 1 NUMBER vs ITBL ;
ICHAN, SCHAN, FROMFILE, PAGEBRC, PAGEEOF, comment PUIn[S].PUI info ;
TOPLINE, NCOLS, NLINES, comment Area info ;
COL, LEFTCH, comment Column info ;
SLIDETOP, comment top of ∞ stacks such as SLIDESG ;
NCSIZE,CCSIZE, NHORIZ,CHORIZ, NVERTI,CVERTI, comment microfilm normal/current settings ;
NEEDCR, comment, assures CR before every LF for Stanford LPT ;
LINENO, MLEAD, SHORTM, SH, BRKS, FSTBRK, CHRS, FSTCHRS, SG, NOTFST, comment, Line info ;
TOTBRKS,
ONE, comment, 1 ;
BOTMAR, TOPMAR, RASTPHIGH, RASTPWIDE, RASTLHIGH, comment raster units ;
LINEY, CURRENTX, CURRENTY, DLBP, DLBP1, FSTFONT,
FONTSIZE, FROMTOP,
LINE, UNDERLINE, CHAR, F, G, LAST, LASL, AVAIL , comment, Justify info ;
JON1, JON2, JON3; COMMENT TEMPS FOR USE BY JLG;
INTEGER SCRIPT, comment baseline adjustment ;
THISFONT, comment PARC font number for scripts;
COPYNUMBER, comment PARC version or copy number ;
SCRLVL; comment baseline level ;
INTEGER TLFTMAR ; TVR temporary left margin in XGP pts;
BOOLEAN MICRO, RASTER ; TES 8/23/74 RASTER = XCRIBL OR MICRO ;
IFC CMUVER THENC BOOLEAN FIRST!OUTPUT ; ENDC RKJ: 10-SEP-74 ;
BOOLEAN NEEDFONTS ; TES 10/17/74 FOR PARC MIC ;
BOOLEAN NEEDVERTI ; TES 11/4/74 ;
BOOLEAN AUTOPACK ; TES 4/3/75 ;
INTEGER FSIZE; comment kludge for sliding foward references ;
EXTERNAL INTEGER RPGSW ;
STRING TMPFILE, LISTFILE, PAGEFILE, IFILE, SFILE, S, SR,
OWL, SS, T, ENDLINE, RESTARTLINE, ENDPAGE, DELINT, CRLF, JOBNO ;
STRING SPSSTR ; COMMENT A STRING OF 200 SPACES (TES 8/28/74) ;
TES 1/7/74 ; STRING CMDFILE ;
STRING INITIALLIST ; TES 3/29/75 ;
TES 3/20/74 ; STRING IFILENAME ; INTEGER IFICHAN ;
REAL RATIO, TERM, TERMX;
INTEGER ARRAY CHARTBL[0:127], OFSIZE,DIVISOR,XINFSTRL,SLIDESG,RB,LBD[1:5] ;
INTEGER ARRAY FNTSIZE,FNTCHAN[0:35] ;
INTEGER ARRAY SCRIPTPARAMS[0:7];
INTEGER ARRAY FNTEC, FNTBC, FNTSIZ, FNTFACE[0:35];
STRING ARRAY LBF[1:5] ;
STRING ARRAY PAGEFILES[1:100] ; TES 4/6/75 ;
INTEGER NPAGEFILES ; TES 4/6/75 ;
PRELOAD!WITH "", " ", " ", " ", " ", " ", " ",
" ", " ", " ", " " ;
THAFE STRING ARRAY SPSARR[0:10] ;
TES ADDED ALL PARC MIC STUFF ABOUT 8/28/74 : ;
IFCR PARCVER or sailver THENC
DEFINE
ELShowCharactersShort = '0,
ELSetSpaceXShort = '140,
ELFont = '160,
ELSetX = '356,
ELSetY = '357,
ELShowCharacters = '360,
ELSetSpaceX = '364,
ELResetSpace = '366,
ELShowRectangle = '376,
ELNop = '377,
ELSHOWOBJECT = '373,
MEOL = -1,
MICOUT(ARRY, COUNT) = [SOUT16(LISTCHAN, ARRY, COUNT)] ;
INTEGER PDIX, OUTCOUNT, TLIX, DLIX, DLREC, PDREC, DDREC;
INTEGER dlgone, DLbeg, ELbeg, SpaceX, BrkToChange;
INTEGER XPNeed, YPNeed, Pass2ScriptLevel, wordbreak;
INTEGER DLBPRESET ; TES 11/17/74;
INTEGER PressBug;
INTEGER ARRAY TL[0:4096], DL[0:12286], PD[0:'2000], NILS[0:'400];
ENDC
STRING TEMPSTR;
INTEGER BufCount, BufPtr;
INTEGER TFMSpace; comment holds the space char width when using ResetSpace;
REAL ARRAY YAboveBase, COMMENT BOUNDING BOX Y OFFSETS;
YBelowBase[0:16];
REAL LastMaxYAbove,
LastMaxYBelow,
MaxYAbove, comment used to position entities when fonts change;
MaxYBelow,
LastLine; comment needed to account for blank lines;
PRELOAD!WITH [128] 0 ; comment initialize array ;
INTEGER ARRAY Buf[0:127] ; comment added by jlj for BOUT16 ;
PRELOAD!WITH [6144] 0;
INTEGER ARRAY DLBuf[0:6143]; comment added by jlg 8/20/85 because
Parc version poorly uses pages 700-712;
PRELOAD!WITH "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December";
THAFE STRING ARRAY MONTHS[1:12];
RKJ: 6-Feb-75 localize CMU code in separate file ;
IFCR CMUVER THENC
CMUCODES
ENDC
SIMPLE INTEGER PROCEDURE BYTECOUNT(INTEGER BPNOW, BPTHEN) ;
RETURN(
((RH(BPNOW)-RH(BPTHEN)) LSH 2) + (4-((BPNOW ROT 3) LAND 7)) ) ;
SIMPLE PROCEDURE WARN(STRING MESSG) ;
USERERR(0,1,MESSG) ;
INTEGER SIMPLE PROCEDURE READIN(STRING FILENAME; BOOLEAN BINARY ; REFERENCE INTEGER BRC, EOF) ;
BEGIN "READIN"
INTEGER CH, FLAG ;
CH ← GETCHAN ; EOF ← 0 ; OPEN(CH, "DSK", IF BINARY THEN 8 ELSE 0,2,0,150, BRC, EOF) ;
LOOKUP(CH, FILENAME, FLAG) ;
IF FLAG THEN WARN("Pass one said to read this file: " &
FILENAME & " but it does not exist") ;
RETURN(CH) ;
END "READIN" ;
comment parameter list changed by jlj to allow for binary mode output ;
INTEGER SIMPLE PROCEDURE WRITEON(STRING FILENAME; integer mode) ;
IFC TENEX THENC
OPENFILE(FILENAME, "WC") ;
ELSEC
BEGIN "WRITEON"
INTEGER CH ;
CH ← GETCHAN ; OPEN(CH, "DSK", mode,0,2,0, 0, 0) ;
AWHILE DO RKJ: 23-JUL-74 - CHECK FOR ENTER FAILURE ;
BEGIN
ENTER(CH, FILENAME, DUMMY←0);
IF NOT DUMMY THEN DONE;
OUTSTR("Cannot ENTER """ & FILENAME & """ Write file: ");
FILENAME←INCHWL;
END;
RETURN(CH);
END "WRITEON" ;
ENDC
IFC TENEX THENC
INTEGER SIMPLE PROCEDURE WRITE16(STRING FILENAME) ;
BEGIN "WRITE16"
INTEGER CH ;
CH ← GTJFN(FILENAME, 1) ;
IF CH<0 THEN WARN("Error in GTJFN of Document file " & FILENAME) ;
OPENF(CH, '200000100000) ;
IF !SKIP! THEN
BEGIN
ERSTR(!SKIP!,0) ;
WARN("Error opening Document file " & FILENAME) ;
END ;
RETURN(CH) ;
END "WRITE16" ;
ENDC
STRING SIMPLE PROCEDURE MICROFILM(INTEGER OP, ARG) ;
RETURN('177 & OP & (IF OP LEQ '42 THEN (ARG DIV 128)&(ARG MOD 128) ELSE ARG)) ;
STRING SIMPLE PROCEDURE SETSIZE(INTEGER N) ; RETURN(MICROFILM(CSIZE, CCSIZE ← N)) ;
STRING SIMPLE PROCEDURE SETHORIZ(INTEGER N) ; RETURN(MICROFILM(HORIZ, CHORIZ ← N)) ;
STRING SIMPLE PROCEDURE SETVERTI(INTEGER N) ; RETURN(MICROFILM(VERTI, CVERTI ← N)) ;
STRING SIMPLE PROCEDURE DOULINE(INTEGER N) ; RETURN(MICROFILM(ULINE, N)) ;
STRING SIMPLE PROCEDURE DORSPCS(INTEGER N) ; RETURN(MICROFILM(RSPCS, N)) ;
STRING SIMPLE PROCEDURE DOLSPCS(INTEGER N) ; RETURN(MICROFILM(LSPCS, N)) ;
STRING SIMPLE PROCEDURE DOUDOTS(INTEGER N) ; RETURN(MICROFILM(UDOTS, N)) ;
STRING SIMPLE PROCEDURE DORDOTS(INTEGER N) ; RETURN(MICROFILM(RDOTS, N)) ;
RECURSIVE STRING PROCEDURE VARBLANK(INTEGER N);
BEGIN "VARBLANK"
IFC CMUXGP THENC
IF N LEQ 0 THEN RETURN(NULL) ELSE
IF N GEQ 128 THEN RETURN(VSB & 127 & VARBLANK(N-127)) ELSE
RETURN(VSB&N)
ELSEC IFC SAILXGP THENC
IF N LEQ 0 THEN RETURN(NULL) ELSE
IF N GEQ 64 THEN RETURN(ESCAPE2 & 63 & VARBLANK(N-63)) ELSE
RETURN(ESCAPE2&N)
ELSEC IFC PARCVER THENC
RETURN(CTLE&CVS(N)&".")
ENDC ENDC ENDC;
END "VARBLANK";
INTERNAL STRING SIMPLE PROCEDURE SPS(INTEGER N) ;
IF N LEQ 10 THEN RETURN(SPSARR[N MAX 0])
ELSE IF DEVICE=MIC THEN RETURN(DORSPCS(N))
ELSE RETURN(SPSSTR[1 TO N]) ;
IFC TENEX THENC
STRING PROCEDURE SCANTO(STRING BRKS; REFERENCE STRING SCANNEE; BOOLEAN INCLUDE) ;
BEGIN
INTEGER DUMMY ;
SETBREAK(LOCAL!TABLE, BRKS, NULL, IF INCLUDE THEN "IA" ELSE "IR") ;
RETURN(SCAN(SCANNEE, LOCAL!TABLE, DUMMY)) ;
END ;
ENDC
IFC PARCVER THENC PARCOUT ENDC
IFC SAILVER THENC
SIMPLE PROCEDURE BOUT16(INTEGER X, CHAN) ;
BEGIN
INTEGER i ;
BufCount ← BufCount - 1; comment # words remaining in the buffer ;
IDPB(X, BufPtr) ; comment deposit byte X into Buf ;
if BufCount ≤ 0 then begin comment output the buffer ;
ARRYOUT(CHAN, Buf[0], 128) ; comment dump words ;
for i ← 0 thru 127 do
Buf[i] ← 0 ; comment re-initialize Buf ;
BufCount ← 256 ; comment # words in a record ;
BufPtr ← Point(16,Buf[0],-1) ;
end ;
END "BOUT16" ;
SIMPLE PROCEDURE SOUT16(INTEGER CHAN; INTEGER ARRAY LOC; INTEGER COUNT) ;
BEGIN
INTEGER i ;
OUTCOUNT ← OUTCOUNT + COUNT ; comment OUTCOUNT = total # words written ;
FOR I ← 0 THRU (COUNT - 1) DO
BOUT16(LOC[i], CHAN); comment output the bytes ;
END "SOUT16";
SIMPLE INTEGER PROCEDURE MICPAD ;
BEGIN
INTEGER N ;
N ← 256 - OUTCOUNT MOD 256 ;
IF N < 0 THEN WARN("PUB BUG -- TOO MUCH IN A RECORD") ;
IF N < 256 THEN MICOUT(NILS, N) ;
IF OUTCOUNT MOD 256 THEN
WARN("PUB BUG -- TOO LITTLE IN A RECORD") ;
RETURN(OUTCOUNT DIV 256) ; COMMENT NO. OF NEXT RECORD ;
END "MICPAD" ;
SIMPLE PROCEDURE WISHPMAP ;
BEGIN "WISHPMAP"
INTEGER DLOC, SDP, COUNT ;
DLOC ← LOCATION(DL[0]) ;
SDP ← Point(16, DLBuf[0], -1);
COUNT ← (BYTECOUNT(DLBP,DLBP1) + 1) DIV 2;
START!CODE "WISH"
LABEL LOOP ;
MOVN '13,COUNT ;
MOVE '14,DLOC ;
HRL '14,'13 ;
MOVE '13, SDP ;
LOOP: ILDB '15, '13 ;
MOVEM '15, 0('14) ;
AOBJN '14, LOOP ;
MOVEM '13,SDP ;
END "WISH" ;
MICOUT(DL, COUNT) ;
END "WISHPMAP" ;
Comment Routines for dealing with the EL;
simple procedure ELByte (integer b);
begin integer j;
j←TLIX div 2;
b←b land '377;
TL[j]←(if (TLIX land 1)=0 then b lsh 8 else b+TL[j]);
TLIX←TLIX+1;
end;
simple procedure ELWord (integer b);
begin ELByte(b lsh -8); ELByte(b) end;
simple procedure ELDWord (integer b);
begin ELWord(b lsh -16); ELWord(b) end;
simple integer procedure ELPos;
return (TLIX);
procedure ELOut;
begin integer i,j;
j←TLIX; if (j land 1)=1 then ELBYTE(ELNOP);
j←j div 2;
MICOUT(TL, j);
TLIX←0;
end;
Comment Routines for putting things into the EL.;
simple procedure SetPosD(integer code,pos);
begin
if code=ELSetX then XPNeed←-1 else YPNeed←-1;
ELByte(code);
ELWord(pos);
end;
simple procedure Show;
if dlgone then begin
if XPNeed neq -1 then SetPosD(ELSetX,XPNeed);
if YPNeed neq -1 then SetPosD(ELSetY,YPNeed);
while dlgone do begin
integer i;
i←dlgone min 255;
if i leq 32 then ELByte(ELShowCharactersShort+i-1)
else begin
ELByte(ELShowCharacters);
ELByte(i);
end;
dlgone←dlgone-i;
end;
end;
simple procedure SetPos(integer code,pos);
begin
Show; comment flush out existing characters;
if code=ELSetX then XPNeed←pos else YPNeed←pos;
end;
simple procedure SetSpace(integer s);
begin
Show;
SpaceX←s;
if s<2048 then ELWord((ELSetSpaceXShort lsh 8)+s) else
begin
ELByte(ELSetSpaceX);
ELWord(s);
end;
end;
simple procedure BCPLString(string s; integer maxlen);
begin integer i;
ELByte(maxlen min length(s));
for i←1 thru maxlen do
ELByte(if i>length(s) then 0 else s[i for 1]);
end;
Comment The routine that computes how much to go up/down
for super/sub scripts;
simple integer procedure SubSuperAmt(integer dir,rasthigh);
begin integer firstone,nlevel,dosuper,ix;
nlevel←Pass2ScriptLevel+dir;
firstone←(Pass2ScriptLevel=0) or (nlevel=0);
dosuper←(Pass2ScriptLevel>0) or (nlevel>0);
ix←(if firstone then 0 else 2)+(if dosuper then 0 else 4);
Pass2ScriptLevel←nlevel;
Comment Value is a+b*high/1000, where a in micas;
return(SCRIPTPARAMS[ix]+(SCRIPTPARAMS[ix+1]*rasthigh)%1000);
end;
ENDC;
comment done with new code ;
STRING SIMPLE PROCEDURE SPARAM ;
BEGIN "SPARAM"
STRING S ;
S ← NULL ;
DO S ← S & INPUT(SEQCHAN, TO!ALTMODE!SKIP) UNTIL SEQBRC = ALTMODE OR SEQEOF ;
RETURN(S) ;
END "SPARAM" ;
INTEGER SIMPLE PROCEDURE IPARAM ; RETURN(CVD(SPARAM)) ;
IFC CMUXGP THENC RKJ: 29-AUG-74;
INTEGER SIMPLE PROCEDURE INDEX2(STRING A,B);
comment returns the location of the first occurance of
the string B in A, 0 if none;
BEGIN "INDEX2"
INTEGER LA, LB;
IF (LB←LENGTH(B))=0 THEN RETURN(1);
IF (LA←LENGTH(A)-LB+1) LEQ 0 THEN RETURN(0);
START!CODE
LABEL L1, L2, OUTT, NEXT;
MOVE 2,A; MOVN 1,LA; ILDB 0,B; SOS 0,LB;
L1: ILDB 3,2; CAME 3,0; NEXT: AOJL 1,L1;
JUMPE 1,OUTT;
MOVE 4,2; MOVE 5,B; MOVE 6,LB;
L2: ILDB 7,4; ILDB '10,5; CAME 7,'10; JRST NEXT; SOJG 6,L2;
ADD 1,LA; AOJ 1,0;
OUTT:
END;
END "INDEX2";
SIMPLE STRING PROCEDURE FIXUP(STRING S);
BEGIN "FIXUP"
INTEGER ALOC,BLOC;
IF NOT XCRIBL THEN RETURN(S) ; RKJ: 28-SEP-74 ;
IF (ALOC←INDEX2(S,USEA))=1 THEN RETURN(S);
IF (BLOC←INDEX2(S,USEB))=1 THEN RETURN(S);
IF ALOC=0 THEN ALOC←BLOC;
IF BLOC=0 THEN BLOC←ALOC;
ALOC←ALOC MIN BLOC;
RETURN(S[ALOC FOR 2]&S[1 TO ALOC-1]&S[ALOC+2 TO ∞]);
END "FIXUP";
ELSEC
DEFINE FIXUP(X)="X";
ENDC
IFC TENEX THENC
SIMPLE PROCEDURE SFBSZ(INTEGER CHAN, SIZE) ;
BEGIN "SFBSZ"
INTEGER K ;
DEFINE JSYS=['104000000000], SFBSZ=[JSYS '46];
K ← CVJFN(CHAN) ;
START!CODE "BYTE16"
MOVE 1,K; MOVE 2,SIZE; SFBSZ ;
END "BYTE16" ;
END "SFBSZ" ;
ENDC
ONE ← 1 ; COMMENT TO FORCE ARRAY TO BE DYNAMIC ;
BEGIN "VARIABLE BOUND ARRAY BLOCK"
THAFE INTEGER ARRAY CW[-1:ONE] ; comment cw[-1] is used to signal tfm font type;
REQUIRE "DATUM" SOURCE!FILE ;
REQUIRE "FILES" SOURCE!FILE ;
REQUIRE "FONTS" SOURCE!FILE ;
RKJ: 6-FEB-75 MOVED UNMASH TO OUTER BLOCK;
SIMPLE STRING PROCEDURE UNMASH(STRING Q) ;
BEGIN TES 8/14/74 PACK EXCESS-64 4-BIT BYTES INTO 7-BIT BYTES ;
STRING S ; S ← NULL ;
WHILE FULSTR(Q) DO S ← S & (((LOP(Q)-64)LSH 4) + (LOP(Q)-64)) ;
RETURN(S) ;
END ;
comment hopefully won't need since it is for OLDMIC, but double check. jlj ;
IFC PARCVER THENC IFC OLDMIC THENC
SIMPLE INTEGER PROCEDURE INITIALAPPD(STRING S) ; PARCAPPD ; TES 3/29/75 ;
ENDC ENDC
COMMENT I N I T I A L I Z E ;
WCW ← WHATIS(CW) ;
IFC PARCVER THENC
SR ← NULL ;
DUMMY←CVSIX("PUB2 ");
START!CODE
MOVE 1,DUMMY;
'104000000210;
END;
ARRCLR(NILS, 1) ;
ENDC
SPSSTR ← SP ;
FOR I ← 1 THRU 200 DO SPSSTR ← SPSSTR & SP ; TES 8/28/74 ;
SCRIPT ← 10;
IFC TENEX THENC JOBNO ← CVS(GJINF(DUMMY, DUMMY, DUMMY)) ; ENDC TES 10/25/73 ;
IFC CMUVER THENC JOBNO ← ("0" & CVS(CALL(0,"PJOB")))[INF-1 FOR 2] ; ENDC RKJ: 6-FEB-75 ;
IFC PARCVER THENC IML←65; IMC←72; ENDC
IFC SAILVER THENC IML←53; IMC←69; ENDC
IFC ITSVER THENC IML←55; IMC←69; ENDC PJ 5/28/74 ;
IFC CMUVER THENC IML←55; IMC←69; ENDC
IFC ISIVER THENC IML←55; IMC←69; ENDC
PAGEHIGH ← PAGEWIDE ← PAGECT ← 0 ; CRLF ← CR & LF ;
SETBREAK(ONE!CHAR, NULL, NULL, "XA") ;
SETBREAK(TO!ALTMODE!SKIP, ALTMODE, NULL, "IS") ;
SETBREAK(TO!LF!APPD, LF, NULL, "IA") ;
SETBREAK(BREAKER, RUBOUT&VT&ALTMODE&CR&LF, NULL, "IS") ;
SETBREAK(TO!RUB!ALT!SKIP, RUBOUT&ALTMODE, NULL, "IS") ;
IFC TENEX THENC
IF RPGSW THEN
BEGIN
IFICHAN ← READIN(JOBNO & ".PASS2", FALSE, DUMMY, DUMMY) ;
IFILENAME ← INPUT(IFICHAN, TO!ALTMODE!SKIP) ;
RELEASE(IFICHAN) ; TES 6/11/74 ;
END
ELSE BEGIN TES 6/11/74 REVISED ;
OUTSTR("MANUSCRIPT: ") ;
WHILE -1 = (J ←
GTJFNL(NULL, '162000000000, '100000101,
NULL, NULL, NULL, "PUB", NULL, NULL, NULL)) DO
OUTSTR(" ?" & CRLF & "MANUSCRIPT: ") ;
IFILENAME ← JFNS(J, '1000000000) ;
RLJFN(J) ;
END ;
ENDC
IFC CMUVER THENC
OPEN(SEQCHAN←GETCHAN,"DSK",'17,0,0,0,0,0);
AWHILE DO
BEGIN
LOOKUP(SEQCHAN,"PUPSEQ"&(PUIEXT←"."&JOBNO&"I"),DUMMY);
IF NOT DUMMY THEN DONE;
OUTSTR("cannot find intermediate files."&CRLF&
"under what job number did you run Pass 1? ");
JOBNO←("0" & INCHWL)[INF-1 FOR 2];
END;
RELEASE(SEQCHAN);
ENDC RKJ: 6-FEB-75 ;
SEQCHAN ← READIN(
IFC TENEX THENC IFILENAME&".FILES" ELSEC "PUPSEQ"&PUIEXT ENDC,
FALSE, SEQBRC, SEQEOF) ;
TMPFILE ← SPARAM ;
LISTFILE ← SPARAM ;
TEMPSTR ← "";
FOR I ← 1 THRU LENGTH(LISTFILE) DO
IF LISTFILE[I FOR 1] ≠ " " THEN
TEMPSTR ← TEMPSTR & LISTFILE[I FOR 1];
LISTFILE ← TEMPSTR;
PRINT(LISTFILE); comment tell user the output file name;
DEBUG ← IPARAM ;
DEVICE ← IPARAM ;
XCRIBL ← DEVICE=XGP ;
BufCount ← 256 ; comment for BOUT16. # free 16 bit bytes left in Buf ;
BufPtr ← POINT(16, Buf[0], -1) ; comment for BOUT16. where to dump output bytes ;
IFC PARCVER or sailver THENC
MICRO ← DEVICE=MIC ;
PDIX ← OUTCOUNT ← 0 ;
IF MICRO THEN
BEGIN
DLBP1 ← Point(8, DLBuf[0], -1);
DLBP ← DLBP1;
END ;
ELSEC MICRO ← FALSE ; ENDC ;
RASTER ← MICRO OR XCRIBL ;
DELINT ← SPARAM ;
FWFILE ← SPARAM ;
LOFONT ← IPARAM ; HIFONT ← IPARAM ;
AUTOPACK ← IPARAM ; TES 4/3/75 ;
NEEDFONTS ← FALSE ; TES 10/17/74 ;
IF NOT AUTOPACK THEN NEEDFONTS ← TRUE ; TES 4/3/75 ;
FOR J ← LOFONT THRU HIFONT DO
IF FULSTR(FNTNAME[J] ← SPARAM) THEN
BEGIN
BRC ← FNTFIL[J] ← CREATE(-1,255) ; MAKEBE(BRC, CW) ;
READFONT(J, FNTNAME[J], NULL); comment set up all the font width info;
END;
IFC SAILVER OR PARCVER THENC
IF MICRO AND (NEEDFONTS OR AUTOPACK) THEN
BEGIN TES 10/17/74 ;
K ← -1 ;
FOR J ← LOFONT THRU HIFONT DO IF FULSTR(FNTNAME[J]) THEN
FNTNUMBER[J] ← K ← K + 1 ;
END ;
ENDC
CMDFILE ← SPARAM ;
BAR ← SPARAM[1 FOR 1] ;
IF BAR = SP THEN BAR ← 0 ; TES 10/22/73 ;
CHARW ← IPARAM;
NEEDVERTI ← FALSE ;
IF (MILLVERTI←IPARAM) LEQ 0 THEN
BEGIN
INTRA ← IFC NOT SAILXGP THENC 0 ; ENDC
MILLVERTI ← ABS(MILLVERTI) ;
NEEDVERTI ← RASTER ;
END
ELSE INTRA ← MILLVERTI ;
BASELINE ← IPARAM; BASELINE←BASELINE+(BASELINE DIV 4);
DOPASS3 ← IPARAM; RKJ: 1-4-74;
IFC CMUVER THENC FIRST!OUTPUT ← NOT DOPASS3 ; ENDC RKJ: 28-SEP-74 ;
VBPI ← IPARAM ;
HBPI ← IPARAM ;
MINLFTMAR ← IPARAM ;
TOPMAR ← (IPARAM*VBPI + 500) DIV 1000 ; TES 1/26/74 ;
BOTMAR ← (IPARAM*VBPI + 500) DIV 1000 ; TES 1/26/74 ;
begin DCS Super/Sub script parameters from file; integer def,i,v;
def←true;
for i←0 thru 7 do begin
v←IPARAM;
if v neq 0 then def←false;
SCRIPTPARAMS[i]←v;
end;
if def then for i←0 step 2 until 6 do begin
SCRIPTPARAMS[i]←0;
SCRIPTPARAMS[i+1]←333;
end;
end;
INTRA ← (INTRA*VBPI + 500) DIV 1000 ; TES 11/2/74 ;
RASTVERTI ← (MILLVERTI*VBPI + 500) DIV 1000 ; TES 11/2/74 ;
IF NOT RPGSW AND NOT RASTER THEN COMMENT STARTED BY ".R PUB2" ;
DO BEGIN
OUTSTR("OUTPUT DEVICE (LPT or TTY): ") ;
S ← INCHWL ;
DEVICE ← IF ANS(L) THEN LPT ELSE IF ANS(T) THEN TTY ELSE 0 ;
END
UNTIL DEVICE ;
IF NOT RPGSW AND DEBUG THEN
IF DEVICE = MIC THEN DEBUG ← 0
ELSE DO BEGIN
OUTSTR("Debug info in right margin? (Y or N) = ") ;
S ← INCHWL ;
DEBUG ← IF ANS(Y) THEN -1 ELSE IF ANS(N) THEN 0 ELSE 100 ;
END
UNTIL DEBUG < 100 ;
ENDLINE ← LF ; ENDPAGE ← FF ;
IFC PARCVER or sailver THENC IF MICRO THEN ENDLINE ← MEOL ; ENDC
RESTARTLINE ←
IFC PARCVER THENC IF XCRIBL THEN CTLT&"0." ELSE CR
ELSEC CR ENDC ; TES 11/1/73 ;
IFC SAILVER THENC
CASE DEVICE-1 OF
BEGIN "DEV" comment note the difference in the mic device;
comment 1...LPT ; LISTCHAN ← WRITEON(LISTFILE,0) ;
comment 2...TTY ; LISTCHAN ← WRITEON(LISTFILE,0) ;
comment 3...MIC ; LISTCHAN ← WRITEON(LISTFILE, '10);
comment 4...XGP ; LISTCHAN ← WRITEON(LISTFILE,0)
END "DEV" ;
ENDC;
IFC TENEX THENC LISTFILE ← JFNS(LISTCHAN, 0) ; ENDC ;
J ← 0 ; FOR K ← RUBOUT, ALTMODE, VT, CR, LF DO CHARTBL[K] ← J ← J + 1 ;
LABCHAN ← READIN(
IFC TENEX THENC IFILENAME&".LABELS" ELSEC "PULABL"&PUIEXT ENDC,
FALSE, LABBRC, LABEOF) ;
NL ← CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP)) ;
LASL ← 1000 ; comment, last physical line occupied on the page ;
S←INPUT(SEQCHAN,TO!LF!APPD); comment get to right place ;
IFC PARCVER THENC
IF MICRO THEN INITIALLIST ← SPARAM ;
ENDC
TES 1/7/74 ADDED : TES 6/11/74 WITH INTRA:;
IFC PARCVER THENC
IF XCRIBL THEN OUT(LISTCHAN,
(RUBOUT&CTLC) & CMDFILE &
("K EFHJKLMQRSTU" & CR & "I " & CVS(INTRA) &
CR & "M 0" & CR & "W 1600" & CR & "E" & CR)) ;
COMMENT
CTLC Initiallize switches (used as RUBOUT CTLC)
CTLE Variable blank
CTLF Font change
CTLH Overstrike
CTLJ=LF Line Feed
CTLK Vertical Spacing
CTLL=FF Form Feed
CTLM=CR Carriage Return
CTLQ Quote control character
CTLR Return to baseline from ript
CTLS Subscript
CTLT Tab
CTLU Superscript
RUBOUT Treat as control character (inverse CTLQ)
;
IFC OLDMIC THENC
IF MICRO AND AUTOPACK THEN BEGIN PARCINITIALLIST END ; TES 4/3/75 ;
ENDC
DLBP ← DLBP1 ;
OUTCOUNT ← 0 ;
ENDC
IFC SAILVER THENC
IF XCRIBL THEN
OUT(LISTCHAN,"/LMAR="&CVS(LFTMAR)&"/XLINE="&CVS(INTRA)&CMDFILE&CRLF&FF) ;
ENDC
IFC ITSVER THENC PJ 8/24/74 ;
IF XCRIBL THEN
BEGIN
OUT(LISTCHAN,";LFTMAR "&CVS(LFTMAR)&CRLF&
";VSP "&CVS(INTRA)&CRLF&
";SKIP 1"&CRLF);
SETBREAK(LOCAL!TABLE,CR,NULL,"IA") ;
DO OUT(LISTCHAN, SCAN(CMDFILE, LOCAL!TABLE, BRC)&LF ) UNTIL BRC NEQ CR ;
OUT(LISTCHAN, FF);
SETBREAK(LOCAL!TABLE,NULL,NULL,"IS");
END;
ENDC
IFC CMUVER THENC
IF XCRIBL THEN OUT(LISTCHAN,UNMASH(CMDFILE)&
CMU!FMT(1)&
(IF NEEDVERTI THEN CMU!VS(INTRA) ELSE NULL));
ENDC
BEGIN "INNER BLOCK"
STRING ARRAY LABTAB[0:1, 0:NL], OWLS[0:FIML-1] ;
AWHILE DO
BEGIN "LABEL"
TABLE ← CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP)) ; IF LABEOF THEN DONE ;
LABTAB[TABLE, CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP))] ←
INPUT(LABCHAN, TO!ALTMODE!SKIP) &
(IF RASTER THEN
(ALTMODE & INPUT(LABCHAN, TO!ALTMODE!SKIP))
ELSE NULL);
END "LABEL" ;
RELEASE(LABCHAN);
COMMENT G O ! ;
IF MICRO THEN IML ← 1 ; COMMENT SAVE STORAGE ;
DO comment, This loop is re-entered only if page image grows ;
BEGIN "SIZE"
THAFE STRING ARRAY IMG[1:IML+IML], SEG[0:8*IMC], SRCREF[1:IML] ;
THAFE INTEGER ARRAY LINK,FAKE,LASC[1:IML+IML], LEADING,SNUCK[1:1000]; TES ?IML+1] ; RKJ: 6-FEB-75 SNUCK ;
LABEL CONTINUE ;
INTEGER SIMPLE PROCEDURE APPD(STRING S) ;
IFC PARCVER THENC PARCAPPD ENDC
Comment
Body of INITIALAPPD(s) and APPD(s), the two basic routines
that write out text characters. This routine IDPB's chars
into the output buffer, and accounts the widths as it does
so. Current X position is saved in CURRENTX, and
is updated. CW must point to an array of widths (micas). ;
IFC SAILVER THENC
comment "MAPPD" performed only when DEVICE = MIC, otherwise, APPD performed ;
IF MICRO THEN TES 10/9/74 REVISED FOR CURRENTX ;
BEGIN "MAPPD"
INTEGER SRC,len,spcnt, I, J;
BOOLEAN GotResetSpace;
comment this code tries to mimic the code that works for the non-tfm files - the
code for the non-tfm files has the ability to sort of look ahead because it can
later adjust the width of the space character, but this code cannot do that
because the position of the next word must be known at the time the characters
are placed in the DL - well anyway, this is as far as I got - maybe the SetX
commands can be placed in the EL later on once the exact positioning is known,
but this will have to be done for each word, since S sometimes has more than
one word in it.;
IF WORDBREAK=FALSE AND SPACEX NEQ -1 THEN
GotResetSpace := TRUE
ELSE
GotResetSpace := FALSE;
LEN ← LENGTH(S);
IF LEN = 0 THEN
RETURN(CHAR) ;
if PressBug then Outstr(s);
IF CW[-1] = -1 THEN
BEGIN "TFM FILE"
IF YPNEED ≠ -1 THEN
SetPosD(ELSetY, YPNeed);
IF XPNEED ≠ -1 THEN
SetPosD(ELSetX, XPNeed);
I ← 1;
WHILE LEN > 0 DO
BEGIN
J ← I;
WHILE S[I FOR 1] ≠ SP AND (I ≤ LENGTH(S)) DO
BEGIN
IDPB(S[I FOR 1], DLBP); comment load the chars into the DL
CURRENTX ← CURRENTX + CW[S[I FOR 1]]; comment update currentx;
I ← I + 1;
LEN ← LEN - 1;
END;
IF (I ≠ J) THEN
BEGIN
INTEGER K;
WHILE (I ≠ J) DO comment put these chars into the DL;
BEGIN
K ← (I - J) min 255;
IF K ≤ 32 THEN
ELByte(ELShowCharactersShort+K-1)
ELSE
BEGIN
ELByte(ELShowCharacters);
ELByte(K);
END;
J ← J + K;
END;
END;
IF S[I FOR 1] = SP AND (I ≤ LENGTH(S)) THEN COMMENT SKIP BUT COUNT SPACES;
BEGIN
IF GotResetSpace THEN
CW[SP] := TFMSpace;
J ← I;
WHILE S[J FOR 1] = SP AND (J ≤ LENGTH(S)) DO
J ← J + 1;
CURRENTX ← CURRENTX + ((CW[SP]) * (J-I));
ELByte(ELSetX);
ELWord(CurrentX);
LEN ← LEN - (J-I);
I ← J;
END;
END;
IF GotResetSpace THEN
CW[SP] := SpaceX;
END "TFM FILE"
ELSE
BEGIN COMMENT CW[-1] ≠ -1;
spcnt←0;
QUICK!CODE "MAPPEND"
LABEL LOOP ;
DEFINE X=['13], BYTE=['14], CNT=['15];
MOVEI CNT, S ;
MOVE X, 0(CNT) ;
MOVEM X, SRC ;
HRRZ CNT,-1(CNT) ;
MOVE X, CURRENTX ;
LOOP:
ILDB BYTE, SRC ;
cain byte,SP;
aos spcnt;
IDPB BYTE, DLBP ;
ADD BYTE, CW ;
SKIPLE 1(BYTE) ; comment remember cw starts at -1;
ADD X, 1(BYTE) ; COMMENT ADD CHARACTER WIDTH ;
SOJG CNT, LOOP ;
MOVEM X, CURRENTX ;
END "MAPPEND" ;
IF SPCNT NEQ 0 AND WORDBREAK=FALSE AND SPACEX NEQ -1 THEN
BEGIN
Show; comment put out chars not including these;
ELByte(ELResetSpace);
dlgone←dlgone+len;
Show;
SetSpace(SpaceX);
END
ELSE
dlgone←dlgone+len;
END; COMMENT CW[-1] ≠ -1;
DLBPRESET ← -1 ; TES 11/17/74;
RETURN(CHAR + LENGTH(S));
END "MAPPD"
ELSE
ENDC
comment end new code ;
comment executed only if DEVICE ≠ MIC. ;
BEGIN "APPD"
INTEGER HAD, EXTRA, SPACES, F ; STRING T, SS ;
L ← LINE ; EXTRA ← LENGTH(S) ;
IF XCRIBL THEN
BEGIN TES 11/13/73 FOR MULTI-COLUMNS ;
IF CHAR < (HAD ← LASC[L]) THEN
BEGIN
FAKE[L] ← FAKE[L] + HAD - CHAR ;
HAD ← LASC[L] ← CHAR ;
END
END
ELSE
WHILE CHAR < (HAD ← LASC[L]) DO IF (F←LINK[L]) THEN L ← F ELSE
IF (LINK[L] ← AVAIL←AVAIL+1) > IML+IML THEN
WARN("Too much for one page: " & S)
ELSE L ← AVAIL ;
SPACES ← CHAR - HAD ; HAD ← HAD + FAKE[L] ;
T ← IMG[L] ;
IF LENGTH(T) < HAD+SPACES+EXTRA THEN
BEGIN comment no room -- must use concatenate ;
SS ← SPS(SPACES) ;
IF DEVICE=MIC THEN FAKE[L] ← FAKE[L] + LENGTH(SS) - SPACES ;
IMG[L] ← IF HAD THEN T[1 TO HAD]&SS&S ELSE (0&SS&S)[2 TO ∞]
END
ELSE BEGIN comment there's room in old string -- IDPB into it.;
SS ← T[HAD + 1 FOR 1] ; comment byte pointer to IDPB place ;
START!CODE "APPEND" LABEL LOOP1, LOOP2 ;
MOVE 1, SS ; MOVE 2, S ; MOVE 3, EXTRA ;
MOVE 4, SPACES ; JUMPE 4, LOOP2 ; MOVEI 5, '40 ; LOOP1: IDPB 5,1 ; SOJG 4,LOOP1 ;
LOOP2: ILDB 5, 2 ; IDPB 5, 1 ; SOJG 3, LOOP2 ;
END "APPEND" ;
END ;
RETURN(LASC[L] ← CHAR + EXTRA) ;
END "APPD" ;
COMMENT * * * * C T R L * * * * ;
SIMPLE PROCEDURE CTRL(STRING S) ;
BEGIN "CTRL"
CHAR ← 0 MAX APPD(S) - LENGTH(S) ;
LASC[L] ← CHAR ;
FAKE[L] ← FAKE[L] + LENGTH(S) ;
END "CTRL" ;
SIMPLE PROCEDURE MCTRL(INTEGER C) ;
BEGIN "MCTRL"
QUICK!CODE "MCTRLAPPEND"
LABEL RBYTE ;
DEFINE WD=['13] ;
MOVE WD, C ;
CAIG WD,'377 ;
JRST RBYTE ;
ROT WD, -8 ;
IDPB WD, DLBP ;
ROT WD, 8 ;
RBYTE:
IDPB WD, DLBP ;
END "MCTRLAPPEND" ;
END "MCTRL" ;
RKJ: 8-Nov-74 following code;
IFC CMUVER THENC
SIMPLE PROCEDURE CMUSCRIPT(INTEGER LEVEL; STRING S);
BEGIN "CMUSCRIPT" RKJ: modified 6-Feb-75 ;
STRING SCRIPT;
IF LEVEL>0 THEN SCRIPT←CMU!SUP(LEVEL,0) ELSE SCRIPT←CMU!SUB(-LEVEL,0);
WHILE FULSTR(S) DO
BEGIN CTRL(SCRIPT); CHAR←APPD(LOP(S)) END;
END "CMUSCRIPT";
ENDC
SIMPLE PROCEDURE UNDERSCORE(INTEGER RIGHTCHAR) ;
BEGIN "UNDERSCORE"
INTEGER NUMCHARS, DESCEND, SAVEHORIZ ;
NUMCHARS ← RIGHTCHAR - UNDERLINE ;
IF NUMCHARS > 0 THEN
BEGIN
SAVEHORIZ ← CHORIZ ;
DESCEND ← CCSIZE DIV 4 ;
CTRL( DOLSPCS(CHAR-UNDERLINE) & DOUDOTS(-DESCEND) & DOULINE(NUMCHARS-1) &
SETHORIZ(CCSIZE) & DOULINE(1) & DOLSPCS(1) & SETHORIZ(SAVEHORIZ) &
DOUDOTS(DESCEND) & DORSPCS(CHAR - RIGHTCHAR + 1) ) ;
UNDERLINE ← RIGHTCHAR ;
END ;
END "UNDERSCORE" ;
SIMPLE PROCEDURE CHANGESPACING ;
IF (N←CHRS-CHAR-1)>0 AND (K←(J←N*CHORIZ+SHORTM)/N MIN 511) NEQ CHORIZ THEN
BEGIN "CHANGESPACING"
IF UNDERLINE GEQ 0 THEN UNDERSCORE(CHAR) ;
SHORTM ← J - K*N ;
IF NOTFST AND (UNDERLINE<0 OR SHORTM<0) THEN
BEGIN CTRL(DORDOTS(SHORTM)) ; SHORTM ← 0 END ; TES CTRL 8/28/74;
CTRL(SETHORIZ(K)) ; NOTFST ← TRUE ;
END "CHANGESPACING" ;
SIMPLE PROCEDURE FONTSELECT(INTEGER WHICH);
BEGIN "FONTSELECT"
IF (WHICH←WHICH-"0")>9 THEN WHICH←WHICH-("A"-"0"-10);
THISFONT ← WHICH ; TES 10/17/74 ;
IFC CMUXGP THENC
WHICH←WHICH MOD 9; COMMENT MAKE 1,A 2,B EQUIVALENT;
IF WHICH=1 THEN CTRL(USEA) ELSE
IF WHICH=2 THEN CTRL(USEB) ELSE
WARN("Font " & CVS(WHICH) & " ignored")
ELSEC IFC SAILVER OR PARCVER THENC
comment Used to change fonts. Font number to switch to
is in WHICH (mapped via FNDNUMBER to PRESS font);
IF XCRIBL THEN
IF WHICH>16 THEN WARN("Font " & CVS(WHICH) & " ignored") ELSE
BEGIN
CTRL(ESCAPE1&(WHICH-1));
IF SCRLVL THEN CTRL(ESCAPE1&'43&SCRLVL);
END
ELSE IF MICRO THEN
IF 0 LEQ WHICH LEQ 15 THEN
BEGIN
IF (YBelowBase[WHICH] > MaxYBelow) THEN
MaxYBelow ← YBelowBase[WHICH];
IF (YAboveBase[WHICH] > MaxYAbove) THEN
MaxYAbove ← YAboveBase[WHICH];
Show;
ELByte(ELFont + FNTNUMBER[WHICH]) ;
WHICH←FNTFIL[WHICH] ; MAKEBE(WHICH,CW) ; TES 10/9/74 ;
END
ELSE WARN("FONT NUMBER OUT OF RANGE")
ENDC ENDC;
END "FONTSELECT";
STRING SIMPLE PROCEDURE XTABSTR(INTEGER N); RKJ: NEW 1-4-74;
BEGIN "XTABSTR"
IFC CMUXGP THENC RETURN(XTAB&XGPNUM(N)) ENDC
IFC SAILXGP THENC
RETURN(ESCAPE1&'40&XGPNUM(N))
ENDC
IFC PARCVER THENC
RETURN(CTLT&CVS(N)&".")
ENDC;
END "XTABSTR";
SIMPLE PROCEDURE XGPTAB(INTEGER N); RKJ: NEW 1-4-74;
CTRL(XTABSTR(N+TLFTMAR));
STRING PROCEDURE SCNBYCOUNT(INTEGER COUNT) ;
BEGIN
INTEGER I ; STRING S ;
S ← NULL ;
FOR I ← 1 THRU COUNT DO S ← S & SCN(ONE!CHAR) ;
RETURN(S) ;
END ;
IFC PARCVER THENC PARCLINE ENDC
IFC SAILVER THENC
SIMPLE PROCEDURE MICTAB(INTEGER N) ;
SetPos(ELSetx,CURRENTX←N+TLFTMAR) ;
SIMPLE PROCEDURE OPENLINE(INTEGER FSTTAB, XFSTFONT) ;
comment parameters are always (0, -1);
BEGIN "OPENLINE" TES 10/17/74 XFSTFONT ;
dlgone←0; ELbeg←ELPos;
DLbeg ← BYTECOUNT(DLBP, DLBP1) ;
IF XFSTFONT<0 THEN
CURRENTY ← LINEY ← LineY - ((Line - LastLine) *
(LastMaxYBelow + LastMaxYAbove + MillVerti));
IF XFSTFONT geq 0 then ELByte(ELFont+FNTNUMBER[XFSTFONT]);
SetPos(ELSetY, CURRENTY);
Pass2ScriptLevel←0; wordbreak←false;
MICTAB(FSTTAB) ;
BrkToChange←0; SpaceX←-1;
if totbrks neq 0 and SHORTM > 0 then
begin integer m;
m←SHORTM div totbrks;
n←SHORTM mod totbrks;
if n neq 0 then begin
m←m+1;
BrkToChange←n;
end;
if PressBug then Outstr("=="&cvs(totbrks)&","&cvs(shortm)&","&cvs(m));
IF CW[-1] = -1 THEN comment tfm file;
CW[SP] := m
ELSE
SetSpace(m);
end;
END "OPENLINE" ;
SIMPLE PROCEDURE CLOSELINE ;
BEGIN "CLOSEL"
IF FULSTR(SR) THEN BEGIN MICTAB(RGTMAR-TLFTMAR) ; APPD(SR) ; SR←NULL END ;
Show;
if (ELPos land 1)=1 then ELByte(ELNop);
ELWord(0);
ELDWord(DLbeg);
ELDWord(BYTECOUNT(DLBP,DLBP1)-DLbeg);
ELWord(0); comment X OFFSET;
ELWord((-1) * MaxYAbove); COMMENT Y OFFSET;
ELWord(TLFTMAR); COMMENT LEFT;
ELWord(LineY - MaxYBelow - MaxYAbove); COMMENT BOTTOM;
ELWord(RGTMAR-TLFTMAR); COMMENT WIDTH;
ELWord(MaxYAbove + MaxYBelow); COMMENT HEIGHT;
ELWord(1+(ELPos-ELbeg) div 2);
END "CLOSEL" ;
ENDC
SIMPLE PROCEDURE IMPOSSIBLE(STRING HOW) ;
BEGIN "IMPOSSIBLE"
IF SG > -1 THEN
BEGIN
OUTSTR(CRLF & HOW & " Error."&CRLF&
"This is an encoding of text line " & CVS(LINE) & ":" & CRLF) ;
FOR I ← 1 THRU SG DO OUTSTR(SEG[I]) ;
END ;
WARN("A supposedly impossible condition has been encountered."&CRLF&
"This is most likely a PUB bug. However, you may have an error"&CRLF&
"which produced unanticipated line lengths or other strange effects."&
(IF DEBUG THEN CRLF&"Line/Page: "&SRCREF[LINE] ELSE NULL)) ;
END "IMPOSSIBLE" ;
SIMPLE PROCEDURE SLIDERROR ;
BEGIN
IMPOSSIBLE(CVS(SLIDETOP)&" Horizontal Positioning") ;
SLIDETOP ← 1 ;
END ;
SIMPLE PROCEDURE RIGHTBOUND ;
BEGIN "RIGHTBOUND" COMMENT RIGHT BOUND OF ∞ ;
PLK: procedure reworked on 6-FEB-75;
integer DEST, CURRENT, NFSIZE, TEMP; string FILLER, OLBF;
NFSIZE←FSIZE-OFSIZE[SLIDETOP];
DEST←(RB[SLIDETOP]-NFSIZE) div DIVISOR[SLIDETOP];
CURRENT←LBD[SLIDETOP]+OFSIZE[SLIDETOP];
OLBF←LBF[SLIDETOP];
FILLER←null;
if RASTER then
begin "RASTER"
if fulstr(OLBF) then
begin "XGP INFINITY"
TEMP←(DEST-CURRENT) div XINFSTRL[SLIDETOP]; PLK: this is how many we can get in ;
while TEMP>0 do
begin TEMP←TEMP-1; FILLER←FILLER&OLBF; end;
SEG[TEMP←SLIDESG[SLIDETOP]] ← FILLER;
SEG[TEMP+1]←RUBOUT & "=" & cvs(DEST);
end "XGP INFINITY"
else SEG[SLIDESG[SLIDETOP]] ← RUBOUT & "=" & cvs(DEST);
end "RASTER"
else
begin "NON RASTER"
if fulstr(OLBF) then
begin "INFINITY"
TEMP←DEST-CURRENT;
while length(FILLER)<TEMP do
FILLER←FILLER&OLBF;
if length(FILLER)>TEMP then
FILLER←FILLER[1 to TEMP];
SEG[SLIDESG[SLIDETOP]]←FILLER;
end "INFINITY"
else SEG[SLIDESG[SLIDETOP]]←RUBOUT & "=" & cvs(DEST);
end "NON RASTER";
CHRS←DEST;
BRKS←0; FSTCHRS←CHRS; FSTBRK←SG; comment nojust to left;
FSIZE←(IF DIVISOR[SLIDETOP]=2 THEN (NFSIZE DIV 2) ELSE 0);
SLIDETOP←SLIDETOP-1;
END "RIGHTBOUND";
SIMPLE INTEGER PROCEDURE STEP!SG ;
IF SG<8*IMC THEN RETURN(SG←SG+1)
ELSE BEGIN
IMPOSSIBLE("Line complexity") ;
RETURN(SG←0) ;
END ;
IF PAGEHIGH THEN GO TO CONTINUE ; comment, re-entered ;
AWHILE DO
BEGIN "FILE"
PAGEFILE ← SPARAM ;
IF SEQEOF THEN DONE ;
PAGEFILES[NPAGEFILES←NPAGEFILES+1] ← PAGEFILE ; TES 4/6/75 ;
IFC TENEX THENC
IFILE ← IFILENAME & OCTEXT & PAGEFILE ;
SFILE ← IFILENAME & TXTEXT & PAGEFILE ;
ELSEC
IFILE ← PAGEFILE & PUIEXT ; SFILE ← PAGEFILE & "S"&PUIEXT ;
ENDC
ICHAN ← READIN(IFILE, TRUE, PAGEBRC, PAGEEOF) ; SCHAN ← READIN(SFILE, FALSE, PAGEBRC, PAGEEOF) ;
AWHILE DO
BEGIN "PAGE"
PAGEHIGH ← INNUM ;
IF PAGEEOF OR PAGEHIGH LEQ 0 THEN DONE ; PAGEWIDE ← INNUM ;
LFTMAR ← 0 MAX (INNUM*HBPI + 500) DIV 1000 - MINLFTMAR ; TES 6/11/74 ADDED ;
RGTMAR ← 0 MAX ((8500-INNUM)*HBPI + 500) DIV 1000 - MINLFTMAR ; TES 8/29/74 ADDED ;
COMMENT HBPI HORIZ BITS PER INCH, MINLFTMAR BIT MIN MARGIN;
IF NOT MICRO AND (PAGEHIGH > IML OR PAGEWIDE > IMC) THEN
BEGIN "EXPAND"
IFC SAILVER THENC
IF DEVICE=MIC THEN
BEGIN "FRAME SIZE"
IF LASL NEQ 1000 THEN OUT(LISTCHAN, ENDPAGE) ;
NVERTI ← 11000 DIV PAGEHIGH MIN 16384 DIV PAGEWIDE MIN 375 ;
NHORIZ ← 10*NVERTI DIV 11 ; NCSIZE ← (9*NHORIZ DIV 80)*8 ;
OUT(LISTCHAN, SETSIZE(NCSIZE)&SETHORIZ(NHORIZ)&SETVERTI(NVERTI)) ;
END "FRAME SIZE"
ELSE IF DEVICE = LPT THEN
BEGIN
IF (LASL-1) MOD 66 + 1 LEQ 6 AND (PAGEHIGH-1) MOD 66 < 60 THEN
OUT(LISTCHAN, ENDPAGE) ;
ENDLINE ← IF PAGEHIGH GEQ 54 THEN RUBOUT & '21 ELSE LF ;
END ;
ENDC;
IML ← PAGEHIGH ; IMC ← PAGEWIDE ;
DONE ; comment, Exit "SIZE" block and immediately reenter with bigger IMG array ;
END "EXPAND" ;
CONTINUE: OUTSTR(SP & CVS(PAGECT ← PAGECT + 1)) ; AVAIL ← IML ;
comment *****CurrentY now points to the top of the current entity*****;
FromTop ← 11*VBPI - TopMar;
RASTPHIGH ← 11*VBPI - (TOPMAR+BOTMAR) ;
RASTLHIGH ← FNTINF[1];
IFC SAILVER THENC
IF PAGECT > 1 THEN
IF DEVICE = LPT THEN COMMENT AVOID SPURIOUS BLANK PAGE ;
IF (IML-1) MOD 66 < 60 THEN OUT(LISTCHAN, ENDPAGE)
ELSE FOR L ← (LASL-1) MOD 66 + 2 THRU 66 DO
BEGIN OUT(LISTCHAN, CR) ; OUT(LISTCHAN, ENDLINE) END
ELSE
IF DEVICE ≠ MIC THEN COMMENT JLG 9/11/85 NOT NEEDED IN PRESS FILE;
OUT(LISTCHAN, ENDPAGE) ;
ENDC
IFC CMUXGP THENC
IF PAGECT>1 THEN OUT(LISTCHAN,ENDPAGE);
ENDC
IFC SAILVER OR PARCVER THENC
IF MICRO THEN
BEGIN
FSTFONT ← -1 ; comment FSTFONT is justify info ;
DLBP ← DLBP1 ; comment byte pointer having to do with justification ;
TLIX ← 0 ; comment an integer declared in PARCARRAY ;
END ;
ENDC
WHILE (TOPLINE ← INNUM) > -10 DO
BEGIN "AREA"
NCOLS ← INNUM ; NLINES ← INNUM ;
FOR COL ← 1 THRU NCOLS DO
BEGIN "COLUMN"
LastMaxYBelow ← 0; COMMENT JLG NEEDED SO CURRENTY IS SET CORRECTLY IN OPENLINE;
LastMaxYAbove ← 0;
LastLine ← 0;
LineY ← FromTop - (FntInf[1] * (TopLine - 1));
LEFTCH ← INNUM ;
TLFTMAR ← LFTMAR + CHARW*(LEFTCH-1) ; TVR: Initiallize left margin for this column ;
WHILE (LINENO ← INNUM) DO
BEGIN "LINE"
SH ← SHORTM ← INNUM ;
MLEAD ← INNUM ; TES 11/2/74 ;
SG ← FSTBRK ← -1 ;
BRKS ← CHRS ← FSTCHRS ← SLIDETOP ← 0 ;
LINE ← TOPLINE - 1 + LINENO ;
IF LINE<1 OR LINE>PAGEHIGH THEN
BEGIN
WARN("Area outside page. If Pass one didn't tell you too, then there is a bug in PUB");
LINE←LINE MAX 1 MIN PAGEHIGH ;
END ;
L ← INNUM ; F ← L MOD FIML ; OWL ← OWLS[F] ;
IF FULSTR(OWL) THEN BEGIN FROMFILE ← FALSE ; OWLS[F] ← NULL END
ELSE BEGIN FROMFILE ← TRUE ;
WHILE L NEQ (M←CVD(INPUT(SCHAN, TO!ALTMODE!SKIP))) DO
BEGIN S ← NULL ;
RKJ: 4-26-74, added EOF stuff on next two lines ;
DO S ← S & INPUT(SCHAN, TO!LF!APPD) UNTIL PAGEBRC = LF OR PAGEEOF ;
IF PAGEEOF THEN USERERR(0,0,"Bad input from Pass One (a PUB bug), I give up.");
OWLS[M MOD FIML] ← S ;
END ;
END ;
IF NOT DEBUG THEN S ← SCN(TO!ALTMODE!SKIP)
ELSE BEGIN
SR ← IF MICRO THEN NULL ELSE SRCREF[LINE] ;
SR ← SR & " " & SCN(TO!RUB!ALT!SKIP) ;
WHILE PAGEBRC NEQ ALTMODE DO
BEGIN "ERROR MESSG"
S ← SCN(TO!RUB!ALT!SKIP) ; M ← LENGTH(S)+3 ; L ← LINE ;
IF DEVICE=TTY OR (IMC MAX 75)+13*(NCOLS-COL)+LENGTH(SR)+M LEQ 119 THEN
SR ← SR & "..." & S ;
END "ERROR MESSG" ;
IF NOT MICRO THEN SRCREF[LINE] ← SR ;
END ;
DO BEGIN "PIECE"
S ← SCN(BREAKER) ; TES 11/6/74 ;
WHILE NOT PAGEEOF AND NOT PAGEBRC DO
S ← S & SCN(BREAKER) ; TES 11/6/74 ;
CHRS ← CHRS + LENGTH(SEG[STEP!SG] ← S) ;
CASE CHARTBL[PAGEBRC] OF
BEGIN comment by BRC ;
comment 0 ... ; IMPOSSIBLE("0"&CVOS(PAGEBRC)&" Break Character") ;
comment 1 ... RUBOUT -- Font change ; BEGIN
SEG[STEP!SG] ← RUBOUT & (F←SCN(ONE!CHAR)) &
(S ← IF F="-" OR F="+" OR F="=" THEN SCN(TO!ALTMODE!SKIP)
ELSE IF F = "F" THEN SCN(ONE!CHAR)
ELSE IF F = "V" THEN LENGTH(S←SCN(TO!ALTMODE!SKIP)) & S TES 3/29/75 ;
ELSE IF F="π" THEN SCNBYCOUNT(SCNUM) TES 1/11/75 SCNUM ;
ELSE NULL) ;
IF F = "π" THEN CHRS ← CHRS + TES 9/10/75: ;
(IFC PARCVER THENC IF DEVICE=TTY THEN 0 ELSE ENDC 1)
ELSE IF F = "+" THEN CHRS ← CHRS + CVD(S)
ELSE IF F = "-" THEN CHRS ← CHRS - CVD(S)
ELSE IF F = "→" THEN
BEGIN COMMENT ∞ ;
IF (SLIDETOP ← SLIDETOP + 1) > 5 THEN SLIDERROR ;
SLIDESG[SLIDETOP] ← SG ; RB[SLIDETOP] ← SCNUM ;
LBD[SLIDETOP] ← SCNUM ;
DIVISOR[SLIDETOP] ← SCNUM ;
IF RASTER THEN
PLK; XINFSTRL[SLIDETOP]← SCNUM ;
LBF[SLIDETOP] ← SCN(TO!ALTMODE!SKIP) ;
IF RASTER AND FULSTR(LBF[SLIDETOP]) THEN STEP!SG ; RKJ: 1-9-74;
OFSIZE[SLIDETOP]←FSIZE;
END
ELSE IF F = "←" THEN
RIGHTBOUND
ELSE IF F = "=" THEN BEGIN
comment 8/9/73 RKJ IF RASTER THEN SHORTM←(SHORTM-BRKS*CHARW) MAX 0;
BRKS←0 ; FSTCHRS←CHRS←CVD(S) ; FSTBRK←SG END ;
END ; COMMENT NOJUST LEFT OF TAB ;
comment 2 ... ALTMODE -- Word Break ; BEGIN BRKS ← BRKS + 1 ; SEG[STEP!SG] ← ALTMODE END ;
comment 3 ... VT -- label reference ;
BEGIN "LABEL REF"
STRING S;
S ← LABTAB[(F←SCNUM) LSH -14, F LAND '37777] ;
L ← LENGTH(SEG[STEP!SG] ← SCAN(S, TO!ALTMODE!SKIP, DUMMY)) ;
J ← CVD(S) ;
SHORTM ← SHORTM - (IF RASTER THEN J ELSE L) ; CHRS ← CHRS + L ;
FSIZE←FSIZE+(IF RASTER THEN J ELSE L);
END "LABEL REF" ;
comment 4 ... CR -- Justify it ;
BEGIN "JUSTIFY"
WHILE SLIDETOP DO BEGIN SLIDERROR ; RIGHTBOUND END ;
IF SHORTM < 0 THEN SHORTM ← 0 ;
BEGIN "DISTRIBUTE SPACES";
COMMENT beta(α,K) = [α(K+1)] - [αK], PJ 5/27/74 ITS doesn't like <control-C>'s
WHERE α = SHORTM/BRKS, is h.m. spaces to insert at the K'th break ;
TOTBRKS←BRKS;
RATIO ← IF BRKS=0 THEN 0.0 ELSE SHORTM/BRKS;
TERM ← RATIO + .0001;
BRKS ← 1;
END "DISTRIBUTE SPACES" ;
UNDERLINE←-1 ; LINE←TOPLINE-1+LINENO MAX 1 MIN PAGEHIGH ; CHAR ← 0 MAX LEFTCH-1 MAX 0 ;
IFC CMUVER THENC IF XCRIBL THEN CHAR←LASC[LINE]; ENDC RKJ: 7-Nov-74, needed for multi column;
NOTFST ← FALSE ; CHRS ← CHRS + CHAR ;
TVR: Initial column select for XGP ;
IF XCRIBL AND (LEFTCH NEQ 1 OR LFTMAR > 0) THEN XGPTAB(0) ;
IFC SAILVER OR PARCVER THENC IF MICRO THEN OPENLINE(0, -1) ; ENDC
IF XCRIBL THEN LEADING[LINE] ← TES 11/4/74; RKJ: 7-Nov-74;
IF MLEAD = 0 THEN 0
ELSE IF MLEAD > 0 THEN (MLEAD*VBPI + 500) DIV 1000
ELSE -((-MLEAD*VBPI + 500) DIV 1000) ;
FOR G ← 0 THRU SG DO IF FULSTR(S ← SEG[G]) THEN CASE CHARTBL[S] OF
BEGIN comment three cases ;
comment 0 ... text ;
BEGIN "TEXT SEG"
IF UNDERLINE<0 OR BAR=0 TES 10/22/73 ; THEN
RKJ: modified 8-Nov-74;
BEGIN
IFC CMUVER THENC
IF SCRLVL NEQ 0 THEN CMUSCRIPT(SCRLVL,S) ELSE CHAR←APPD(S);
ELSEC
CHAR ← 0 MAX APPD(S);
ENDC
END ELSE
COMMENT *** UNDERLINING *** ;
IF DEVICE = MIC THEN
IFC not SAILVER THENC
BEGIN K ← LENGTH(S) ;
WHILE K DO
BEGIN COMMENT DON'T UNDERLINE BLANKS ;
N ← LOP(S) ;
IF N=SP THEN BEGIN UNDERSCORE(CHAR-K) ; UNDERLINE←UNDERLINE+1 END ;
K ← K - 1 ;
END ;
END
ENDC
IFC sailver or PARCVER THENC
begin integer x,i;
x←0;
for i←1 thru length(s) do x←x+CW[s[i for 1]];
Show;
SetPosD(ELSetX,CURRENTX);
SetPosD(ELSetY,CURRENTY-80);
ELByte(ELShowRectangle);
ELWord(x); ELWord(20);
SetPos(ELSetY,CURRENTY);
APPD(s);
end
ENDC
ELSE IF XCRIBL THEN
BEGIN
IFC CMUXGP THENC
RKJ: New code for new XGP system at CMU 8-Nov-74 and 6-Feb-75;
CTRL(CMU!UND(BAR));
CHAR←0 MAX APPD(S);
CTRL(CMU!UND(0));
ENDC
IFC ISIVER THENC
K←LENGTH(S); SS←0&SPS(K*4); N←LOP(SS);
START!CODE "XGPUNDER"
DEFINE LEN= [2],SRC= [3],DEST= [4],RUB= [5],ESC= [6],R= [7],CNT= ['10],UBAR= ['11];
LABEL LOOP,ELOOP,SPACE,OUTT;
SETZ CNT,0; MOVE LEN,K; MOVE SRC,S; MOVE DEST,SS; MOVEI RUB,'177; MOVEI ESC,'35; MOVE UBAR,BAR;
LOOP: ILDB R,SRC;
CAIE R,BAR; CAIN R,SP; JRST SPACE;
IDPB RUB,DEST; IDPB ESC,DEST; IDPB R,DEST; IDPB UBAR,DEST;
ELOOP: SOJG LEN,LOOP;
MOVEM CNT,N; JRST OUTT;
SPACE: IDPB R,DEST;
AOJA CNT,ELOOP;
OUTT:
END "XGPUNDER";
CHAR ← 0 MAX APPD(SS[1 TO (K*4-N*3)])-(K-N)*3;
LASC[L]←CHAR; FAKE[L]←FAKE[L]+(K-N)*3;
ENDC
IFC SAILXGP THENC CHAR ← 0 MAX APPD(S); ENDC
IFC PARCVER THENC
K←LENGTH(S); SS←0&SPS(K*3); N←LOP(SS);
START!CODE "XGPUNDER"
DEFINE LEN= [2],SRC= [3],DEST= [4],BS= [5],UBAR= [6],CNT= [7],R= ['10];
LABEL LOOP, OUTT, NOBAR; TES 8/19/74 TES CHAR BS BAR -> BAR BS CHAR, FOR BOBROW ;
SETZ CNT,0;
MOVE LEN,K; MOVE SRC,S; MOVE DEST,SS; MOVEI BS,'10; MOVE UBAR,BAR;
LOOP: SOJL LEN,OUTT;
ILDB R,SRC;
CAIE R,BAR; CAIN R,SP; AOJA CNT,NOBAR;
IDPB UBAR,DEST; IDPB BS,DEST;
NOBAR: IDPB R,DEST;
JUMPA LOOP;
OUTT: MOVEM CNT,N;
END "XGPUNDER";
CHAR ← 0 MAX APPD(SS[1 TO (K*3-N*2)])-(K-N)*2;
LASC[L]←CHAR; FAKE[L]←FAKE[L]+(K-N)*2;
ENDC
END
ELSE BEGIN CHAR ← 0 MAX APPD(S);
K ← LENGTH(S) ; SS ← 0&S ; N ← LOP(SS) ; CHAR ← 0 MAX CHAR-K ;
IFC NOT CMUXGP THENC RKJ: 1-7-74;
START!CODE "UNDER" LABEL LOOP ;
MOVE 2, K ; MOVE 3, SS ;
LOOP: ILDB 4,3 ; CAIE 4,SP ; CAIN 4,BAR ; CAIA 0,0 ; MOVE 4,BAR ; DPB 4,3 ; SOJG 2,LOOP ;
END "UNDER" ; CHAR ← 0 MAX APPD(SS[1 TO LENGTH(S)]) ;
ELSEC CHAR ← 0 MAX APPD(S); ENDC RKJ: 1-7-74;
END ;
END "TEXT SEG" ;
comment 1 ... RUBOUT -- Font Change ;
IF (F←S[2 FOR 1])="↑" THEN
IFC SAILVER THENC IF DEVICE=MIC THEN
SetPos(ELSetY,(CURRENTY←CURRENTY+SubSuperAmt(1,RASTLHIGH)))
ELSE ENDC
IFC PARCVER THENC
IF MICRO THEN PARCSUPER ELSE
IF XCRIBL THEN
IF (SCRLVL←SCRLVL+SCRIPT) LEQ 0 THEN CTRL("R"-'100) ELSE
BEGIN LABEL L1;
CTRL("U"-'100);
L1:
IF G<SG THEN
BEGIN
SS←SEG[G+1];
IF NULSTR(SS) THEN BEGIN G←G+1; GO L1 END; comment try again ;
IF EQU(SS[1 FOR 2],RUBOUT&"F") THEN
BEGIN
G←G+1;
CTRL(SS[3 FOR 1]);
END ELSE CTRL(THISFONT+"0");
END ELSE CTRL(THISFONT+"0")
END
ELSE ENDC
IFC CMUVER THENC
IF XCRIBL THEN SCRLVL←SCRLVL+SCRIPT ELSE
ENDC RKJ: 22-OCT-74;
IFC SAILXGP THENC
IF XCRIBL THEN
CTRL(ESCAPE1&'43&(SCRLVL←SCRLVL+SCRIPT))
ELSE ENDC LINE←LINE-1 MAX 1
ELSE IF F = "↓" THEN
IFC SAILVER THENC IF DEVICE=MIC THEN
SetPos(ELSetY,(CURRENTY←CURRENTY-SubSuperAmt(-1,RASTLHIGH)))
ELSE ENDC
IFC PARCVER THENC
IF MICRO THEN PARCSUB ELSE
IF XCRIBL THEN
IF (SCRLVL←SCRLVL-SCRIPT) GEQ 0 THEN CTRL("R"-'100) ELSE
BEGIN LABEL L2;
CTRL("S"-'100);
L2:
IF G<SG THEN
BEGIN
SS←SEG[G+1];
IF NULSTR(SS) THEN BEGIN G←G+1; GO L2 END; comment ↑↑↑ ;
IF EQU(SS[1 FOR 2],RUBOUT&"F") THEN
BEGIN
G←G+1;
CTRL(SS[3 FOR 1]);
END ELSE CTRL(THISFONT+"0");
END ELSE CTRL(THISFONT+"0")
END
ELSE ENDC
IFC CMUVER THENC
IF XCRIBL THEN SCRLVL←SCRLVL-SCRIPT ELSE
ENDC RKJ: 22-OCT-74;
IFC SAILXGP THENC
IF XCRIBL THEN
CTRL(ESCAPE1&'43&(SCRLVL←SCRLVL-SCRIPT)) ELSE ENDC LINE←LINE+1 MIN IML
ELSE IF F = "_" THEN
BEGIN
UNDERLINE ← CHAR;
IFC SAILVER THENC
IF XCRIBL THEN CTRL(ESCAPE1&'46);
ENDC
IFC ITSVER PJ 8/23/74 ; THENC
IF XCRIBL THEN BEGIN CTRL(ESCAPE1&'46); CTRL(ESCAPE1&'46) END;
ENDC
END
ELSE IF F = "≡" THEN
BEGIN "END UNDERLINED TEXT"
IFC SAILVER THENC
IF DEVICE = MIC AND BAR TES 10/22/73; THEN UNDERSCORE(CHAR) ;
ENDC
UNDERLINE ← -1 ;
IFC SAILVER THENC
IF XCRIBL AND BAR TES 10/22/73; THEN
CTRL(ESCAPE1&'51&2&3); TES AND REG 11/19/73 ; BH 12/3/74;
ENDC
IFC ITSVER THENC PJ 8/23/74 ;
IF XCRIBL AND BAR THEN BEGIN CTRL(ESCAPE1&'47&3); CTRL(ESCAPE1&'47&4) END;
ENDC
END "END UNDERLINED TEXT"
ELSE IF F="-" THEN
BEGIN
F ← CVD(S[3 TO ∞]) ;
IF DEVICE=MIC THEN
IFC SAILVER THENC
SetPos(ELSetX,CURRENTX←CURRENTX - F*CHARW MAX 0)
ENDC
IFC PARCVER THENC
PARCLEFT
ENDC
ELSE CHAR←CHAR-F MAX 0
END
ELSE IF F="*" THEN CHAR ← 0 MAX LASC[LINE] comment not always correct! ;
ELSE IF F="+" THEN
BEGIN F ← CVD(S[3 TO ∞]) ;
IFC SAILVER THENC
IF DEVICE=MIC THEN
BEGIN
CURRENTX ← CURRENTX + F ; TES 10/9/74 ;
SetPos(ELSetX, CURRENTX);
END
ELSE ENDC
IFC PARCVER THENC
PARCRIGHT
ENDC
IF XCRIBL THEN CTRL(VARBLANK(F))
ELSE CHAR←CHAR+F MIN IMC
END
ELSE IF F="=" THEN
BEGIN "TAB"
F ← CVD(S[3 TO ∞]) ;
IF NOT RASTER THEN F ← (F MAX 0) + LEFTCH - 1 MIN IMC ; TES 8/17/74 FIX BUG ;
IF XCRIBL THEN XGPTAB(F)
ELSE IF DEVICE NEQ MIC THEN CHAR ← F
IFC SAILVER THENC
ELSE IF F+TLFTMAR ≠ CURRENTX THEN
SetPos(ELSetX,CURRENTX←F+TLFTMAR)
ENDC
IFC PARCVER THENC PARCTAB ENDC
END "TAB"
comment need to alter this !!! jlj ;
ELSE IF F = "π" THEN
BEGIN TES 11/29/73 REWROTE ; TES 3/29/75 DELETED SPECIAL ;
IFC CMUXGP THENC
IF UNDERLINE GEQ 0 AND BAR THEN CTRL(RUBOUT&'35) ;
ENDC TES 12/13/73 ;
SS ← UNMASH(S[3 TO ∞]) ;
IFC PARCVER THENC
IF XCRIBL THEN
IF SS="." THEN F←LOP(SS) tes 12/10/74 ;
ELSE SS ← CTLQ & SS ;
IF MICRO THEN CHAR ← 0 MAX APPD(SS)-LENGTH(SS)+1 TES 3/29/75 ;
ELSE
ENDC
BEGIN
IFC CMUVER THENC
IF XCRIBL AND SCRLVL THEN
IF SCRLVL>0 THEN CTRL(CMU!SUP(SCRLVL,0)) ELSE CTRL(CMU!SUB(SCRLVL,0));
ENDC RKJ: 6-Feb-75 ;
F ← IFC PARCVER THENC 0 ELSEC 1 ENDC ; TES 9/10/75 ;
F ← LENGTH(SS)-F ; TES 9/10/75 ;
CHAR ← 0 MAX APPD(SS)-F ;
LASC[L] ← CHAR ; FAKE[L] ← FAKE[L] + F ;
IF UNDERLINE GEQ 0 AND BAR AND DEVICE NEQ MIC
IFC SAILXGP THENC AND NOT XCRIBL ENDC
THEN CTRL(IFC PARCVER THENC '10& ENDC BAR) ; TES 12/13/73;
END ;
END
ELSE IF F = "←" THEN BEGIN END
ELSE IF F="F" THEN FONTSELECT(S[3 FOR 1])
ELSE IF F="V" THEN IFC sailver or PARCVER THENC
BEGIN
INTEGER NEWCOPYNUMBER, N ;
N ← S[2 FOR 1] ;
NEWCOPYNUMBER ← IF N=0 THEN 0 ELSE CVD(S[3 TO 2+N]) ;
IF NEWCOPYNUMBER NEQ COPYNUMBER THEN
BEGIN
COPYNUMBER ← NEWCOPYNUMBER ;
Comment !!!!!! need something eventually !!!! ;
END ;
END
ENDC
ELSE IF F='35 THEN COMMENT OVERSTRIKE NEXT CHAR OVER LAST ;
BEGIN "OVERSTRIKE"
IFC CMUXGP THENC
INTEGER Q;
Q←IMG[L][(LASC[L]+FAKE[L]) FOR 1];
LASC[L]←LASC[L]-1; CHAR ← 0 MAX CHAR-1;
CTRL(RUBOUT&'35); CHAR ← 0 MAX APPD(Q);
ENDC
IFC SAILXGP THENC WARN("Overstrike unimplemented"); ENDC
IFC sailver OR PARCVER THENC
IF MICRO THEN
BEGIN integer tx ;
K ← LDB(DLBP) ; COMMENT LAST CHARACTER OUTPUT ;
IF K>'177 THEN
WARN("ATTEMPT TO OVERLAY A DIRECTIVE")
ELSE BEGIN
F ← LOP(SEG[G+1]) ;
tx←CURRENTX;
SetPos(ELSetX,tx-CW[K]);
APPD(F);
CURRENTX←tx;
SetPos(ELSetX,CURRENTX);
END ;
END
ELSE CTRL('10)
ENDC
END
ELSE IF F="S" THEN SNUCK[LINE]←TRUE RKJ: 6-FEB-75 ;
ELSE IF F=RUBOUT THEN IF NOT XCRIBL THEN CHAR←APPD(SP) ELSE
BEGIN
CHAR ← 0 MAX APPD(RUBOUT&RUBOUT)-1; LASC[L]←CHAR; FAKE[L]←FAKE[L]+1;
END
ELSE IMPOSSIBLE("0"&CVOS(F)&" Control Character") ;
comment 2 ... ALTMODE -- word break ;
IF SHORTM AND G > FSTBRK THEN
BEGIN "SPREAD"
TERMX ← RATIO*(BRKS←BRKS+1) + .0001 ;
IF RASTER THEN
BEGIN "DOVSB"
F ← ((TERMX-TERM) MIN SHORTM) ;
Comment F has desired mica spacing, using an exact computation.
We will actually put out SpaceX, so record accordingly. After
a while, we decrease SpaceX to get line to come out exactly right;
IFC sailver or PARCVER THENC IF MICRO THEN
BEGIN "parcj" integer a,nx;
nx←CURRENTX←CURRENTX+F;
if PressBug then Outstr("="&cvs(F)&","&cvs(SpaceX));
if a geq 0 and (BRKS-1=totbrks or (a=1 and BRKS=totbrks div 2)) then
SetPos(ELSetX, CURRENTX)
else begin
wordbreak←true; comment don't think space is quoted;
APPD(SP);
wordbreak←false;
end;
CURRENTX←nx; comment because APPD updates it;
BrkToChange←BrkToChange-1;
if BrkToChange=0 then
IF CW[-1] = -1 THEN comment tfm file;
CW[SP] := SpaceX-1
ELSE
SetSpace(SpaceX-1);
END "parcj"
ELSE ENDC
CTRL(VARBLANK(F)) ;
SHORTM← SHORTM-F
END "DOVSB"
ELSE CHAR ← 0 MAX CHAR + TERMX - TERM MIN IMC ;
TERM ← TERMX ;
END "SPREAD"
ELSE IF RASTER THEN
BEGIN
CHAR ← 0 MAX APPD(SP);
END;
comment 3-5 ; IMPOSSIBLE("VT in SEG[]") ; IMPOSSIBLE("CR in SEG[]") ; IMPOSSIBLE("LF in SEG[]") ;
END ; COMMENT three cases ;
IFC SAILVER THENC IF CHORIZ NEQ NHORIZ THEN CTRL(SETHORIZ(NHORIZ)) ; ENDC
IFC SAILXGP THENC
IF XCRIBL AND UNDERLINE GEQ 0 THEN
CTRL(ESCAPE1&'47&BASELINE);
ENDC
BRKS ← CHRS ← FSTCHRS ← SLIDETOP ← 0 ; SG ← FSTBRK ← -1 ; SHORTM ← SH ;
IFC PARCVER OR SAILVER THENC
IF MICRO THEN CLOSELINE ;
ENDC
LastMaxYAbove ← MaxYAbove;
LastMaxYBelow ← MaxYBelow;
MaxYBelow ← MaxYAbove ← 0;
LastLine ← Line;
END "JUSTIFY" ;
comment 5 ... LF ; BEGIN END ;
END ; comment, by BRC ;
END "PIECE"
UNTIL PAGEBRC = LF ;
END "LINE" ;
END "COLUMN" ;
END "AREA" ;
IFC SAILVER OR PARCVER THENC
IF MICRO THEN
IF ELPos = 0 THEN COMMENT BLANK PAGES ARE SUPPRESSED ;
ELSE BEGIN "PUTPD"
APPD('0&'0);
while (BYTECOUNT(DLBP,DLBP1) mod 2) neq 0 do APPD(0);
WISHPMAP ; COMMENT WRITE OUT DL ;
ELOut; comment write out EL;
PD[PDIX] ← 0 ;
PD[PDIX+1] ← DLREC ;
dlgone←outcount mod 256;
PD[PDIX+3] ← (if dlgone=0 then 0 else 256-dlgone);
DLREC ← MICPAD ;
PD[PDIX+2] ← DLREC-PD[PDIX+1] ;
PDIX ← PDIX + 4 ;
DLgone←0;
END "PUTPD"
ELSE
ENDC
BEGIN "FINPAGE"
comment MICRO = FALSE to get here ;
FOR LASL ← PAGEHIGH DOWN 1 DO IF LASC[LASL] THEN DONE ;
F ← 120 - (IMC MAX 78) ;
FOR N ← 1 THRU LASL DO
BEGIN "LIST LINE"
L ← N ;
IF DEBUG AND LENGTH(S←SRCREF[L])>F AND DEVICE=LPT THEN
S←S[1 TO F] ;
NEEDCR ← FALSE ;
DO BEGIN "PART LINE"
IF CHAR ← LASC[L] THEN
BEGIN "NONBLANK"
IF NEEDCR THEN OUT(LISTCHAN, RESTARTLINE)
ELSE NEEDCR ← TRUE ; TES 11/1/73;
OUT(LISTCHAN, FIXUP(IMG[L][1 TO CHAR+FAKE[L]])) ;
IFC CMUVER THENC RKJ: 26-SEP-74 - KLUDGE;
IF XCRIBL AND FIRST!OUTPUT THEN
BEGIN
FIRST!OUTPUT←FALSE;
DUMMY←CHNCDB(LISTCHAN);
START!CODE
MOVE 1,DUMMY; HLRZ 1,2(1); MOVE 2,1(1);
MOVEI 3,1; MOVEM 3,1(2);
END;
END;
ENDC
IF DEBUG AND L=N AND FULSTR(S) THEN OUT(LISTCHAN,
(IF XCRIBL THEN XTABSTR(LFTMAR+IMC*CHARW+1)
ELSE SPS((IMC MAX 80)-CHAR)) RKJ: 1-4-74;
& S);
END "NONBLANK" ;
CHAR ← 0 MAX L ; L ← LINK[CHAR] ;
LINK[CHAR] ← LASC[CHAR] ← FAKE[CHAR] ← 0 ;
END "PART LINE" UNTIL L=0 ;
RKJ: 6-FEB-75 JUGGLED FOLLOWING CODE FOR SNUCK ;
IF NOT SNUCK[N] THEN
BEGIN "NOT SNUCK"
OUT(LISTCHAN, CR) ; COMMENT ALWAYS CR BEFORE LF ;
L ← N ; DO L←L+1 UNTIL NOT SNUCK[L] ; COMMENT FIND NEXT REAL LINE ;
IF NEEDVERTI AND
((L ← LEADING[L]+RASTVERTI) IFC SAILXGP THENC NEQ ELSEC > ENDC INTRA) THEN
IFC PARCVER THENC
BEGIN
OUT(LISTCHAN, ENDLINE) ;
OUT(LISTCHAN, CTLK&CVS(L-INTRA)&".") ;
END
ENDC
IFC CMUVER THENC OUT(LISTCHAN, ENDLINE & CMU!ISL(L-INTRA)) ENDC
IFC ISIVER THENC OUT(LISTCHAN, ENDLINE) ENDC comment *** ;
IFC SAILXGP THENC OUT(LISTCHAN, ESCAPE1&'42&(L+1)) ENDC BH 11/19/74 *** ;
ELSE
OUT(LISTCHAN, ENDLINE) ;
END "NOT SNUCK";
SNUCK[N] ← FALSE ; RKJ: 6-FEB-75 ;LEADING[N] ← 0 ; TES 11/4/74 ;
IF DEBUG THEN SRCREF[N] ← NULL ;
END "LIST LINE" ;
FOR N ← LASL+1 THRU PAGEHIGH DO FAKE[N]←LINK[N]←0 ; TES 4/4/74 ;
IFC ITSVER THENC OUT(LISTCHAN, ENDPAGE) ; ENDC
IFC PARCVER THENC
OUT(LISTCHAN, ENDPAGE) ;
ENDC
END "FINPAGE" ;
END "PAGE" ;
IF NOT (PAGEEOF OR PAGEHIGH LEQ 0) THEN DONE ; comment expand IMG ;
RELEASE(ICHAN) ; RELEASE(SCHAN) ;
END "FILE" ;
END "SIZE" UNTIL SEQEOF ;
IFC SAILVER OR PARCVER THENC
IF MICRO THEN
BEGIN "FDTODD" integer f,logdir, PPN, X,
DayHalf, Day, Mo, Yr, TimeHalf, Min, Hr;
String PPNStr, DATE, B, MinStr;
for f←lofont thru hifont do if FULSTR(FNTNAME[f]) then
begin string fam; integer pt,face;
ELWord(16);
ELByte(0);
ELByte(FntNumber[F]);
ELByte(FNTBC[F]);
ELByte(FNTEC[F]);
FONTTYPE(FNTNAME[f], fam, pt, face);
BCPLString(fam, 19);
ELByte(FNTFACE[F]);
ELByte(FNTBC[F]); COMMENT SOURCE;
ELWord(FNTSIZ[F]);
ELWord(0); COMMENT ROTATION;
END;
ELWord(0);
ELOut;
PDREC←MICPAD; Comment next record is part directory;
PD[PDIX]←1;
PD[PDIX+1]←DLREC;
PD[PDIX+2]←PDREC-DLREC;
PDIX←PDIX+4;
MICOUT(PD,PDIX);
DDREC←MICPAD;
ELWord(27183);
ELWord(DDREC+1);
ELWord(PDIX div 4);
ELWord(PDREC);
ELWord(DDREC-PDREC);
ELWord(-1); comment back-pointer to obsolete document directory;
ELWord(-1); comment unused;
ELWord(-1); comment unused;
ELWord(1); ELWord(1); comment copy numbers;
for i←10 thru '177 do ELWord(-1); comment unused;
BCPLString(LISTFILE, 51);
PPN ← Call(0,"GetPPN");
PPN ← PPN LAND '777777;
PPNStr ← B ← CVXSTR(PPN);
WHILE LOP(B) = " " DO
PPNSTR ← PPNSTR[2 TO LENGTH(PPNSTR)];
BCPLString(PPNStr, 31);
X ← Call(0, "AccTim");
DayHalf ← (X LSH -18);
TimeHalf ← (X LAND '777777);
Day ← (DayHalf MOD 31) + 1;
Mo ← ((DayHalf DIV 31) MOD 12) + 1;
Yr ← ((DayHalf DIV 31) DIV 12) + 1964;
Hr ← ((TimeHalf DIV 60) DIV 60);
Min ← ((TimeHalf DIV 60) MOD 60);
MinStr ← CVS(Min);
IF LENGTH(MinStr) = 1 THEN
MinStr ← "0" & MinStr;
DATE ← CVS(DAY)&" "&MONTHS[MO]&" "&CVS(YR)&" "&CVS(HR)&":"& MinStr;
BCPLSTRING(DATE, 37);
ELOut;
MicPad;
ifc not sailver thenc
Comment Alto-format date in words 6,7. Algorithm courtesy
E. Fiala: take lh of GTAD (days since 17 Nov 1858), subtract to
get days since 1 Jan 1901, convert to seconds, and add in seconds
in the current day (rh of GTAD);
i←GTAD; ELDWord(((i lsh -18)-15385)*(3600*24)+(i land '777777));
ELWord(1); ELWord(1); comment copy numbers;
for i←10 thru '177 do ELWord(-1);
BCPLString(LISTFILE, 51);
GJINF(logdir,DUMMY,DUMMY);
BCPLString(DIRST(logdir),31);
BCPLString(ODTIM(-1,-1),37);
ELOut;
MICPAD;
SFBSZ(LISTCHAN, 8) ;
endc
END "FDTODD" ;
ENDC
IFC SAILVER THENC IF NOT MICRO THEN OUT(LISTCHAN, ENDPAGE) ; ENDC
COMMENT IF NOT MICRO ADDED BY JLG 9/3/85;
RELEASE(LISTCHAN) ; RELEASE(SEQCHAN) ;
END "INNER BLOCK" ;
BEGIN EXTERNAL SIMPLE PROCEDURE K!OUT ; K!OUT END ; COMMENT ** ** ** ** ** ;
IF DELINT="A" OR DELINT="a" THEN
BEGIN
OUTSTR(CRLF & "DELETE INTERMEDIATE FILES?(Y OR N,CR)") ;
DELINT ← INCHWL ;
END ;
IF DELINT="Y" OR DELINT="y" THEN
BEGIN "DELETE INTERMEDIATE FILES"
IFC TENEX THENC
SIMPLE PROCEDURE DELVER(STRING FINAME) ;
BEGIN INTEGER CHN ;
CHN ← OPENFILE(FINAME&";*", "RO*") ;
DO DELF(CHN) UNTIL NOT INDEXFILE(CHN) ;
RELEASE(CHN) ;
END ;
IF (I←GTJFN(JOBNO&".PASS2", 0)) GEQ 0 THEN TES 4/6/75 ;
BEGIN
RLJFN(I) ;
DELVER(JOBNO & ".PASS2") ;
END ;
ENDC
TES 4/6/75 DOING PUPSEQ LIKE PULABL ;
IFC TENEX THENC DELVER(IFILENAME & ".FILES") ; ELSEC
SEQCHAN ← READIN("PUPSEQ"&PUIEXT, FALSE, SEQBRC, SEQEOF) ;
RENAME(SEQCHAN, NULL, 0, I) ;
RELEASE(SEQCHAN);
ENDC
IFC TENEX THENC DELVER(IFILENAME & ".LABELS") ; ELSEC
LABCHAN ← READIN("PULABL"&PUIEXT, FALSE, LABBRC, LABEOF) ;
RENAME(LABCHAN, NULL, 0, I) ;
RELEASE(LABCHAN);
ENDC
FOR I ← 1 THRU NPAGEFILES DO TES 4/6/75 USING ARRAY ;
BEGIN
PAGEFILE ← PAGEFILES[I] ;
IFC TENEX THENC
DELVER(IFILENAME & OCTEXT & PAGEFILE) ;
DELVER(IFILENAME & TXTEXT & PAGEFILE) ;
ELSEC
IFILE ← PAGEFILE & PUIEXT ; SFILE ← PAGEFILE & "S"&PUIEXT ;
ICHAN ← READIN(IFILE, TRUE, PAGEBRC, PAGEEOF) ;
SCHAN ← READIN(SFILE, FALSE, PAGEBRC, PAGEEOF) ;
RENAME(ICHAN, NULL, 0, Dummy) ; RENAME(SCHAN, NULL, 0, Dummy) ;
RELEASE(ICHAN); RELEASE(SCHAN);
ENDC
END ;
TES 4/6/75 NO LONGER READING PUPSEQ AT TERMINATION ;
END "DELETE INTERMEDIATE FILES"
ELSE IF DELINT NEQ "N" AND DELINT NEQ "n" THEN
OUTSTR(CRLF&DELINT&"? -- INTERMEDIATE FILES WERE NOT DELETED") ;
OUTSTR("." & CRLF) ; comment signal terminal that pass two is done ;
IF DEVICE = MIC THEN
PTOSTR(0,"DOVER " & LISTFILE)
ELSE
IF DEVICE = XGP THEN
PTOSTR(0,"R XPART; " & LISTFILE);
IFC NOT SAILVER THENC
IF DEVICE = MIC THEN
BEGIN "PASS 3"
INTEGER FCHAN ;
INTEGER SIMPLE PROCEDURE CORELOC(INTEGER ARRAY A) ; START!CODE MOVE 1, A ; END ;
INTEGER ARRAY PASSTHREE[0:4] ;
FCHAN ← WRITEON("$PUB$"&RPGEXT,0) ;
OUT(FCHAN, LISTFILE&CRLF&TMPFILE&CRLF&"F"&CRLF&FF) ;
RELEASE(FCHAN) ;
PASSTHREE[0] ← CVSIX("DSK") ;
PASSTHREE[1] ← CVFIL("TXTF80[1,3]", PASSTHREE[2], PASSTHREE[4]) ;
PASSTHREE[3] ← 1 ; COMMENT STARTING ADDRESS IS NORMAL + 1 ;
OUTSTR("PRODUCING FR80 FILE" & CRLF) ;
CALL(CORELOC(PASSTHREE), "SWAP") ;
END "PASS 3" ;
IF XCRIBL THEN LODED("XSPOOL "&LISTFILE&CRLF);
ENDC
IFC CMUVER THENC
RKJ: 26-SEP-74 ALL NEW CODE;
IF XCRIBL AND DOPASS3 THEN
BEGIN "PASS 3"
WTMPFILE("PB3",LISTFILE&CR&LF,TRUE);
RUNPROG("DSK:PUB3[A700PU00]",1);
START!CODE CALLI 0,'12 END;
END "PASS 3";
RKJ: NOW CHECK FOR MORE COMMANDS IN THE TMP FILE;
IF RTMPFILE("PUB",S,FALSE,TRUE) THEN
BEGIN "RERUN"
RUNPROG("PUB",1);
START!CODE CALLI 0,'12 END;
END "RERUN";
ENDC
IFC ISIVER THENC
TES 8-OCT-74 APPROXIMATION TO WHAT ISI NEEDS;
IF XCRIBL AND DOPASS3 THEN
BEGIN "PASS 3"
INTEGER J, JOBNO ;
JOBNO ← CVS(GJINF(J, I, J)) ;
J ← OPENFILE(JOBNO & ".PASS3", "WT") ;
OUT(J, LISTFILE & CRLF) ;
RELEASE(J) ;
RUNPRG("<SUBSYS>PUB3.SAV", 1, 0) ;
CALL(0,"EXIT") ;
END "PASS 3" ;
ENDC
IFC TENEX THENC CALL(1,"EXIT") ; CALL(0,"EXIT"); ELSEC
START!CODE IFC NOT ITSVER THENC CALLI 1,'12; ENDC CALLI 0,'12; END;
ENDC
MAKEBE(WCW, CW) ;
END "VARIABLE BOUND ARRAY BLOCK" ;
END "PUB2" ;